home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / mcu / float09.arc / COMP.SA < prev    next >
Text File  |  1987-03-04  |  12KB  |  581 lines

  1.  NAM COMP
  2.  TTL   COMPONENT ROUTINES FOR DISPATCH
  3. *
  4. * LINKING LOADER DEFINITIONS
  5. *
  6.   XDEF    RTAR1,RTAR2,RTNAN,RTDNAN,RTZERO,RTINF
  7.   XDEF    RTNAR2,MOVXOR,CLRES,CLTBL,MOVE
  8.   XDEF    INFIN,ZERO,NAN,LARGE,NAN1,NAN4
  9.   XDEF    NAN9,NAN10,IOPSUB,ISDNRM,DNMTBL,IOPSET
  10. *
  11.   XREF    FPMOVE,UNFLNT,CHKUNF
  12. *
  13. * REVISION HISTORY:
  14. *   DATE    PROGRAMMER     REASON
  15. *
  16. *  28.MAY.80    G. STEVENS     ORIGINAL
  17. *  30.MAY.80    G. STEVENS     REWRITE CLRES
  18. *  06.JUN.80    G. STEVENS     REWORK CLRES & CLEAN UP DOC.
  19. *  01.JUL.89    G. STEVENS     REMOVE DUPLICATE TABLES
  20. *  17.JUL.80    G. STEVENS     ADD NAN__ PROCEDURES
  21. *  29.JUL.80    G. WALKER      'CLRES' CLEARS ENTIRE FRACTION
  22. *  04.AUG.80    G. STEVENS     'CLRES' HANDLES DOUBLE CORRECTLY
  23. *  07.AUG.80    G. STEVENS     REMOVE NAN3 AND REPLACE LBSR'S
  24. *  14.AUG.80    G. STEVENS     ADD UNDEFLOW ADJUST TO COMP
  25. *  14.AUG.80    G. STEVENS     ADD ISDNRM FUNCTION
  26. *  14.AUG.80    G. STEVENS     CHANGE PARAMETERS OF ISDNRM
  27. *  27.AUG.80    J. BONEY       ADD IOPSET
  28. *
  29.  PAGE
  30. *
  31. *****************************************************************
  32. *
  33. * NOW HERE ARE SOME REGULARLY USED CONSTANTS
  34. *
  35. * INFINITY
  36. *
  37. INFIN FCB  00,$7F,$FF,00,00,00
  38.       FCB  00,00,00,00,00,00
  39.       FCB  TYINF
  40. *
  41. * ZERO
  42. *
  43. ZERO FCB  00,$80,00,00,00,00
  44.      FCB  00,00,00,00,00,00
  45.      FCB  TYINF
  46. *
  47. * NOT A NUMBER( NAN )
  48. *
  49. NAN FCB  00,$7F,$FF,00,00,00
  50.     FCB  00,00,00,00,00,00
  51.     FCB  TYNAN
  52. *
  53. * LARGE NUMBER
  54. *
  55. LARGE FCB  00,00,00,$FF,$FF,$FF
  56.       FCB  $FF,$FF,$FF,$FF,$FF,$FF
  57.       FCB  00
  58. *
  59. * TABLE OF DENORMALIZED EXPONENTS
  60. *
  61. DNMTBL FDB  SMINEX+1
  62.        FDB  DMINEX+1
  63.        FDB  EMINEX
  64.        FDB  EMINEX
  65.        FDB  EMINEX
  66. *
  67. *
  68.  PAG
  69. *
  70. ******************************************************************
  71. *
  72. * SUBROUTINE  RTNAN
  73. *
  74. *   THIS ROUTINE BUILDS A "NAN". THAT IS
  75. * IT COPIES A "NAN" CONSTANT INTO THE
  76. * RESULT ADN THEN GRABS THE "NAN" ADDRESS
  77. * AND PUTS THIS INTO THE RESULT. THE CALLER
  78. * PC CONTAINED IN THE STACVK FRAME IS
  79. * CONSIDERED THE "NAN" ADDRESS.
  80. *
  81. * ON ENTRY: U - STACK FRAME POINTER
  82. *
  83. * ON EXIT: STACK FRAME RESULT CONTAINS A NAN
  84. *       CC DESTROYED
  85. *
  86. *
  87. RTNAN EQU  *
  88. *
  89. * SET UP THE MOVE
  90. *
  91.  PSHS X,Y,D    SAVE CALLER'S REGS
  92.  LEAX  NAN,PCR    POINT X TO NAN CONST.
  93.  LEAY  RESULT,U  POINT Y TO RESULT
  94. *
  95. * MOVE NAN CONSTANT TO RESULT
  96. *
  97.  LBSR  FPMOVE
  98. *
  99. * GET PC FROM STACK FRAME
  100. *
  101.  LDD  CALLPC,U
  102. *
  103. * PUT ADDRESS INTO THE 16 BITS JUST
  104. * TO THE RIGHT OF THE T-BIT
  105. *
  106.  LEAX  FRACTR,U  POINT X TO FRACTION
  107. *
  108. * LEAST SIG. TWO BITS INTO BYTE 3 OF
  109. * FRACTION
  110. *
  111.  LSRD 1
  112.  ROR  2,X
  113.  LSRD 1
  114.  ROR  2,X
  115. *
  116. * MOST SIG. 14 BITS OF ADDRESS RIGHT
  117. * JUSTIFIED INTO BYTES 1&2 OF FRACTION.
  118. *
  119.  STD  0,X
  120. *
  121.  PULS X,Y,D,PC RESTORE AND RETURN
  122. *
  123. * HERE ARE THE INVALID OPERATION HANDLERS. THEY NEED TO
  124. * BE DEFINED WITH UNIQUE ENTRY POINTS FOR THESE CASES
  125. * SINCE THESE ROUTINES ARE ENTRIES IN THE DISPATCH
  126. * TABLES.
  127. *
  128. * PROCEDURES NAN__
  129. *
  130. *      SIGNALS INVALID OPERATION OF THE TYPE SPECIFIED
  131. * BY THE NUMERAL IN THE PROCEDURE NAME AND RETURNS
  132. * A NAN.
  133. *
  134. NAN1 EQU  *
  135. *
  136.   LDA  #01
  137.   BSR  IOPSUB         SIGNAL INVALID OPERATION
  138.   RTS
  139. *
  140. *
  141. NAN4 EQU  *
  142. *
  143.   LDA  #04
  144.   BSR  IOPSUB         SIGNAL INVALID OPERATION
  145.   RTS
  146. *
  147. *
  148. NAN9 EQU  *
  149. *
  150.   LDA  #09
  151.   BSR  IOPSUB          SIGNAL INVALID OPERATION
  152.   RTS
  153. *
  154. *
  155. NAN10 EQU  *
  156. *
  157.   LDA  #10
  158.   BSR  IOPSUB         SIGNAL INVALID OPERATION
  159.   RTS
  160. *
  161. *
  162. * PROCEDURE IOPSUB
  163. *
  164. *     IOPSUB IS THE PROCEDURE INVOKED BY THE IOP MACRO
  165. * TO DO THE WORK OF SETTING THE IOP CODE IN THE SECONDARY
  166. * STATUS BYTE AND THE INVALID OPERATION BIT IN THE
  167. * PRIMARY STATUS BYTE. ADDITIONALLY SINCE A NAN IS RETURNED
  168. * EVERY TIME IOP IS INVOKED THE CALL IS PLACED HERE.
  169. *
  170. * ON ENTRY: A - REG. CONTAINS THE IOP CODE
  171. *
  172. * ON EXIT: SECONDARY STATUS CONTAINS THE IOP CODE &
  173. *       MAIN STATUS HAS ITS IOP BIT SET AND THE
  174. *       STACK FRAME RESULT CONTAINS A NAN.
  175. *
  176. * PROCEDURE IOPSET
  177. *
  178. * IOPSET DOES THE SAME THING AS IOPSUB EXCEPT IT
  179. * DOES NOT RETURN A NAN.
  180. *
  181. *
  182. IOPSUB EQU  *
  183.   BSR  RTNAN               RETURN A NAN
  184. *
  185. IOPSET EQU *
  186.   STA  TSTAT+1,U           SET INVALID OPERATION CODE
  187.   LDA  TSTAT,U               SET IOP BIT IN MAIN STATUS
  188.   ORA  #ERRIOP
  189.   STA  TSTAT,U
  190. *
  191. *
  192.   RTS                   RETURN
  193. *
  194. *
  195. ***************************************************************
  196. *
  197. * PROCEDURE CLRES
  198. *
  199. *    CLRES ZEROS OUT THE BYTES BEYOND THE PRECISION
  200. * OF A F. P. NUMBER SO THAT FALSE SIGNIFICANCE
  201. * WILL NOT BE INTRODUCED UPON NORMALIZATION.
  202. *
  203. *  ON ENTRY:
  204. *        X POINTS TO THE F.P. VALUE
  205. *        B CONTAINS THE PRECISION INDEX
  206. *  ON EXIT: F.P. VALUE HAS ALL ZEROES BEYOND IT'S
  207. *        PRECISION.
  208. *
  209. *
  210. CLRES EQU  *
  211. *
  212.  PSHS  X,D     SAVE CALLERS REGS
  213.  LEAY  CLTBL,PCR
  214.  LSRB              HALVE PREC. OFFSET
  215.  LDA  B,Y          GET OFFSET
  216. *
  217. * IF THE PRECISION IS DOUBLE FIX UP THE
  218. * UNUSUAL BYTE
  219. *
  220.  LSLB              RESTORE OFFSET
  221.  IF  B,EQ,#DBL          DOUBLE PRECISION
  222.    BRA    MASKOF
  223. *
  224.  ENDIF
  225. *
  226.  IF  B,EQ,#EFD         EXTENDED W/ FORCE TO DOUBLE
  227. *
  228. MASKOF EQU  *
  229. *
  230.    LDB    A,X
  231.    ANDB  #BIT7+BIT6+BIT5+BIT4+BIT3
  232.    STB    A,X
  233.    INCA
  234. *
  235.  ENDIF
  236. *
  237. * ZERO THE NECESSARY # OF BYTES
  238. *
  239.  WHILE    A,LT,#(ARGSIZ-1)
  240.    CLR    A,X
  241.    INCA
  242.  ENDWH
  243. *
  244. *
  245.  PULS  X,D,PC       RESTORE AND RETURN
  246. *
  247. * TABLE OF BYTE BOUNDARY OFFSETS
  248. *
  249. CLTBL FCB  06    SINGLE
  250.       FCB  09    DOUBLE
  251.       FCB  11    EXTENDED
  252.       FCB  06    EXTND (ROUND SING.)
  253.       FCB  09    EXTND (ROUND DBL.)
  254.       FCB  03    CLEAR ENTIRE FRACTION (INDEXED BY 'CLRFRC')
  255.       FCB  00    CLEAR ENTIRE STACK FRAME ARGUMENT
  256. *
  257. *
  258. *
  259. *
  260. *
  261.  PAG
  262. *
  263. *
  264. *
  265. *******************************************************************
  266. *
  267. *  SUBROUTINE  RTAR1
  268. *
  269. * THIS ROUTINE MOVES A 13 BYTE
  270. * BLOCK OF CODE FROM LOCATION#
  271. * ARG1 TO LOCATION RESULT. ALL
  272. * ADDRESSING IS DONE RELATIVE TO
  273. * STACK POINTER, U .
  274. *
  275. * ON ENTRY: U - STACK FRAME POINTER
  276. *
  277. * ON EXIT: STACK FRAME RESULT CONTAINS THE
  278. *       FLOATING VALUE RESIDING IN ARG1.
  279. *       X,Y,B,CC - DESTROYED
  280. *
  281. *
  282. *
  283. * SET UP THE MOVE
  284. *
  285. RTAR1 LEAX  ARG1,U  POIT TO ARG1
  286.  LEAY  RESULT,U  POINT Y TO RESULT
  287. *
  288. * MOVE ARG1 TO RESULT ( 13 BYTES )
  289. *
  290.  LBSR  FPMOVE
  291. *
  292.  BSR  ADJUST        ADJUST POSSIBLE APPARENT UNDERFLOW
  293. *
  294.  RTS  RETURN
  295. *
  296. *******************************************************************
  297. *
  298. * SUBROUTINE RTAR2
  299. *
  300. *
  301. * THIS ROUTINE MOVES A 23 BYTE
  302. * BLOCK OF CODE FROM LOCATION#
  303. * ARG2 TO LOCATION RESULT. ALL
  304. * ADDRESSING IS DONE RELATIVE TO
  305. * STACK POINTER, U .
  306. *
  307. * ON ENTRY: U - STACK FRAME POINTER
  308. *
  309. * ON EXIT: STACK FRAME RESULT CONTAINS THE FLOATING
  310. *       VALUE RESIDING IN ARG2.
  311. *       X,Y,B,CC - DESTROYED
  312. *
  313. RTAR2 EQU  *
  314. *
  315. * SET UP THE MOVE
  316. *
  317.  LEAX  ARG2,U  POINT X TO ARG2
  318.  LEAY  RESULT,U  POINT Y TO RESULT
  319. *
  320. * MOVE ARG2 TO RESULT ( 13 BYTES )
  321. *
  322.  LBSR  FPMOVE
  323. *
  324.  BSR  ADJUST       ADJUST POSSIBLE APPARENT UNDERFLOW
  325. *
  326.  RTS  RETURN
  327. *
  328. *****************************************************************
  329. *
  330. * PROCEDURE  ADJUST
  331. *
  332. *    CHECKS AND ADJUSTS FOR AN APPARENT UNDEFLOW CONDITION
  333. * THAT CAN ARRISE WHEN DENORMALIZED VALUES ARE NORMALIZED
  334. * UPON ENTRY TO THE PACKAGE AND THEN JUST RETURNED TO THE
  335. * USER THROUGH ONE OF THE COMPONENT ROUTINES. ADDITIONALLY
  336. * IF THE VALUE IN QUESTION IS AN TRUE DENORMALIZED NUMBER
  337. * THEN THE EXPONENT IS ADJUSTED BY ONE IN THE CASE OF SINGLE
  338. * AND DOUBLE.
  339. *
  340. * ON ENTRY: FP. VALUE IS IN THE RESULT
  341. *        U - STACK FRAME POINTER
  342. *
  343. * ON EXIT: FP. VALUE IS ADJUSTED IF NECCESSARY
  344. *       U,S - UNCHANGED
  345. *       X,Y,D,CC - DESTROYED
  346. *
  347. ADJUST EQU  *
  348. *
  349.   LBSR    CHKUNF          CHECK FOR UNDERFLOW
  350. *
  351.   IFCC    EQ          UNDERFLOW CONDITION EXISTS
  352.     LBSR  UNFLNT      DENORMALIZE RESULT
  353. *
  354.     LDA  TSTAT,U
  355.     ANDA  #$FF-ERRUNF      CLEAR UNDERFLOW FLAG
  356.     STA  TSTAT,U
  357. *
  358.   ELSE
  359.     LEAX  RESULT,U
  360.     LDA  RPREC,U      GET PRECISION
  361.     BSR  ISDNRM
  362.     IFCC  EQ          VALUE IS DENORMALIZED
  363.       IF  A,LE,#DBL      SINGLE OR DOUBLE
  364.     LDD  EXPR,U
  365.     SUBD  #01      ADJUST EXPONENT
  366.     STD  EXPR,U
  367. *
  368.       ENDIF
  369.     ENDIF
  370.   ENDIF
  371. *
  372. *
  373.   RTS              RETURN
  374. *
  375. *
  376. ******************************************************************
  377. *
  378. *  FUNCTION  ISDNRM
  379. *
  380. *     CHECKS TO SEE IF A FLOATING VALUE DENORMALIZED
  381. * OR NOT.
  382. *
  383. * ON ENTRY: X - POINTS AT THE STACK FRAME ARGUMENT
  384. *        A - CONTAINS THE PRECISION INDEX
  385. *        U - STACK FRAME POINTER
  386. *
  387. * ON EXIT: Z BIT SET IF DENORMALIZED IS TRUE
  388. *       Z BIT CLEARED IF DENORMALIZED IS FALSE
  389. *       D,X,Y - UNCHANGED
  390. *
  391. ISDNRM EQU  *
  392. *
  393.   PSHS    D,X,Y        SAVE CALLERS REGS.
  394. *
  395.   LDB  FRACT,X        CHECK FOR UNORMALIZED FRACTION
  396.   IFCC    GE        FRACTION IS UNORMALIZED
  397.     LEAY  DNMTBL,PCR    DENORMALIZED EXPONENT TABLE
  398.     LDD  A,Y
  399.     IF    D,EQ,(EXP,X)    IF EXPONENT CHECKS
  400.       ORCC  #Z
  401. *
  402.     ELSE
  403.       ANDCC  #NZ    NOT DENORMALIZED
  404. *
  405.     ENDIF
  406.   ENDIF
  407. *
  408. *
  409.   PULS    D,X,Y,PC    RESTORE AND RETURN
  410. *
  411. *
  412. *******************************************************************
  413. *
  414. *  SUBROUTINE  RTDNAN
  415. *
  416. *
  417. *    THIS ROUTINE MOVES ARG2, IN "NAN" FORM
  418. * TO THE RESULT WITH THE D BIT SET TO SIGNIFY
  419. * THAT THE "NAN" HAS MET ANOTHER "NAN" WHILE
  420. * PERFORMING SOME OPERATION.
  421. *
  422. * ON ENTRY: ARG2 CONTAINS A NAN
  423. *        U - STACK FRAME POINTER
  424. *
  425. * ON EXIT: RESULT CONTAINS THE NAN RESIDING IN ARG2
  426. *       WITH THE D BIT SET.
  427. *       X,Y,A,CC - DESTROYED
  428. *       U - UNCHANGED
  429. *
  430. * LOCAL EQUATE
  431. *
  432. DSET EQU $80
  433. *
  434. * MOVE ARG2 (NAN) TO THE RESULT
  435. *
  436. RTDNAN BSR  RTAR2
  437. *
  438. * SET D BIT
  439. *
  440.  LDA  #DSET  GET DSET MASK
  441.  STA  RESULT,U    OR THE MASK IN
  442. *
  443.  RTS RETURN
  444. *
  445. *
  446. *******************************************************************
  447. *
  448. *  SUBROUTINE RTZERO
  449. *
  450. *
  451. *   THIS ROUTINE MOVES THE VALUE ZERO TO
  452. * THE RESULT WITH THE SIGN OF RESULT SET
  453. * TO THE EXCLUSIVE-OR OF THE SIGNS OF ARG1
  454. * AND ARG2. ALL ADRESSING IS DONE RELATIVE
  455. * TO STACK POINTER, U .
  456. *
  457. RTZERO LEAX  ZERO,PCR  POINT TO CONSTANT ZERO
  458. *
  459. * MOVE THE CONSTANT ZERO TO RESULT WITH
  460. * THE SIGN OF THE RESULT BEING SET TO THE
  461. * EXCLUSIVE-OR OF THE SIGNS OF ARG1 AND ARG2.
  462. *
  463.  BSR MOVXOR
  464. *
  465.  RTS  RETURN
  466. *
  467. ***************************************************************
  468. *
  469. *  SUBROUTINE  RTINF
  470. *
  471. *
  472. *    THIS ROUTINE MOVES THE VALUE INFINITY
  473. * TO THE RESULT WITH THE SIGN OF THE RESULT
  474. * SET TO THE EXCLUSIVE-OR OF THE SIGNS OF
  475. * ARG1 AND ARG2. ALL ADDRESSING IS DONE
  476. * RELATIVE TO THE STACK POINTER, U .
  477. *
  478. * ON ENTRY: U - STACK FRAME POINTER
  479. *
  480. * ON EXIT: STACK FRAME RESULT CONTAINS ZERO WITH THE
  481. *       SIGN SET TO THE X-OR OF SIGN OF ARG1 & ARG2.
  482. *       X,Y,CC,A - DESTROYED
  483. *       U - UNCHANGED
  484. *
  485. RTINF EQU  *
  486. *
  487.  LEAX  INFIN,PCR  POINT TO CONSTANT INFINITY
  488. *
  489. * MOVE THE CONSTANT INFINITY TO THE RESULT WITH
  490. * THE SIGN SET TO THE EXCLUSIVE-OR OF THE SIGNS
  491. * OF ARG1 AND ARG2.
  492. *
  493.  BSR MOVXOR
  494. *
  495.  RTS  RETURN
  496. *
  497. *
  498. ******************************************************************
  499. *
  500. *  SUBROUTINE  RTNAR2
  501. *
  502. *   THIS ROUTINE MOVES THE NEGATIVE OF
  503. * ARG2 TO RESULT. ALL ADDRESSING IS DONE
  504. * RELATIVE TO STACK POINTER, U .
  505. *
  506. * ON ENTRY: U - STACK FRAME POINTER
  507. *
  508. * ON EXIT: STACK FRAME CONTAINS THE NEGATIVE OF THE
  509. *       FLOATING VALUE RESIDING IN ARG2.
  510. *       X,Y,CC,A - DESTROYED
  511. *       U - UNCHANGED
  512. *
  513. RTNAR2 EQU  *
  514. *
  515.  BSR  RTAR2        MOVE ARG2 TO THE RESULT
  516. *
  517.  LDA  SIGNR,U
  518.  EORA  #$80        COMPLEMENT SIGN OF RESULT
  519.  STA  SIGNR,U
  520. *
  521.  RTS  RETURN
  522. *
  523. *******************************************************************
  524. *
  525. *  SUBROUTINE  MOVXOR
  526. *
  527. *   THIS ROUTINE MOVES A BLOCK OF DATA , WHOSE
  528. * LOCATION IS POINTED TO BY THE X-REG. TO THE
  529. * RESULT AND REPLACES THE SIGN OF THE RESULT
  530. * WITH THE EXCLUSIVE-OR OF THE SIGNS OF ARG1
  531. * AND ARG2.
  532. *
  533. MOVXOR EQU  *
  534. *
  535.  LEAY  RESULT,U
  536. *
  537. * MOVE THE VALUE
  538. *
  539.  LBSR  FPMOVE
  540. *
  541. * PERFORM X-OR OF THE SIGNS OF ARG1 & ARG2
  542. *
  543.  LDA  SIGN1,U  GET SIGN OF ARG1
  544.  EORA  SIGN2,U    X-0R WITH SIGN ARG2
  545.  STA  SIGNR,U  STORE AT RESULT
  546. *
  547.  RTS RETURN
  548. *
  549. *
  550. ********************************************************************
  551. *
  552. *  SUBROUTINE  MOVE
  553. *
  554. *
  555. *   THIS ROUTINE MOVES A BLOCK OF DATA,WHOSE
  556. * LOCATION IS POINTED TO BY THE X-REG., TO
  557. * A LOCATION POINTED TO BY THE Y-REG.. THE
  558. * NO. OF BYTES TO BE MOVED IS CONTAINED IN
  559. * REG. B.
  560. *
  561. * ON ENTRY:
  562. *       X-REG. POINTS TO THE START OF THE
  563. *      BLOCK TO BE MOVED.
  564. *
  565. *       Y-REG. POINTS TO THE START OF THE
  566. *      DESTINATION TO WHICH THE BLOCK IS BEING
  567. *      MOVED.
  568. *
  569. *       B-REG. CONTAINS THE NO. OF BYTES TO BE
  570. *      MOVED.
  571. *
  572. *
  573. MOVE LDA  ,X+  LOAD FROM SOURCE
  574.  STA  ,Y+  STORE AT DESTINATION
  575.  DECB  CHECK BYTE COUNT
  576.  BGT  MOVE  BRANCH TILL DONE
  577. *
  578.  RTS  RETURN
  579. *
  580. *
  581.